NAME - OM CHANDRA

UID - 2021700014

BATCH - L

EXPT - 5

housing_data <- read.csv("C:\\Users\\Om Chandra\\Downloads\\archive (22)\\Housing.csv", header = TRUE, stringsAsFactors = FALSE)
head(housing_data)
summary(housing_data)
       id                date               price            bedrooms     
 Min.   :1.000e+06   Length:21613       Min.   :  75000   Min.   : 0.000  
 1st Qu.:2.123e+09   Class :character   1st Qu.: 321950   1st Qu.: 3.000  
 Median :3.905e+09   Mode  :character   Median : 450000   Median : 3.000  
 Mean   :4.580e+09                      Mean   : 540089   Mean   : 3.371  
 3rd Qu.:7.309e+09                      3rd Qu.: 645000   3rd Qu.: 4.000  
 Max.   :9.900e+09                      Max.   :7700000   Max.   :33.000  
   bathrooms      sqft_living       sqft_lot           floors     
 Min.   :0.000   Min.   :  290   Min.   :    520   Min.   :1.000  
 1st Qu.:1.750   1st Qu.: 1427   1st Qu.:   5040   1st Qu.:1.000  
 Median :2.250   Median : 1910   Median :   7618   Median :1.500  
 Mean   :2.115   Mean   : 2080   Mean   :  15107   Mean   :1.494  
 3rd Qu.:2.500   3rd Qu.: 2550   3rd Qu.:  10688   3rd Qu.:2.000  
 Max.   :8.000   Max.   :13540   Max.   :1651359   Max.   :3.500  
   waterfront            view          condition         grade       
 Min.   :0.000000   Min.   :0.0000   Min.   :1.000   Min.   : 1.000  
 1st Qu.:0.000000   1st Qu.:0.0000   1st Qu.:3.000   1st Qu.: 7.000  
 Median :0.000000   Median :0.0000   Median :3.000   Median : 7.000  
 Mean   :0.007542   Mean   :0.2343   Mean   :3.409   Mean   : 7.657  
 3rd Qu.:0.000000   3rd Qu.:0.0000   3rd Qu.:4.000   3rd Qu.: 8.000  
 Max.   :1.000000   Max.   :4.0000   Max.   :5.000   Max.   :13.000  
   sqft_above   sqft_basement       yr_built     yr_renovated   
 Min.   : 290   Min.   :   0.0   Min.   :1900   Min.   :   0.0  
 1st Qu.:1190   1st Qu.:   0.0   1st Qu.:1951   1st Qu.:   0.0  
 Median :1560   Median :   0.0   Median :1975   Median :   0.0  
 Mean   :1788   Mean   : 291.5   Mean   :1971   Mean   :  84.4  
 3rd Qu.:2210   3rd Qu.: 560.0   3rd Qu.:1997   3rd Qu.:   0.0  
 Max.   :9410   Max.   :4820.0   Max.   :2015   Max.   :2015.0  
    zipcode           lat             long        sqft_living15 
 Min.   :98001   Min.   :47.16   Min.   :-122.5   Min.   : 399  
 1st Qu.:98033   1st Qu.:47.47   1st Qu.:-122.3   1st Qu.:1490  
 Median :98065   Median :47.57   Median :-122.2   Median :1840  
 Mean   :98078   Mean   :47.56   Mean   :-122.2   Mean   :1987  
 3rd Qu.:98118   3rd Qu.:47.68   3rd Qu.:-122.1   3rd Qu.:2360  
 Max.   :98199   Max.   :47.78   Max.   :-121.3   Max.   :6210  
   sqft_lot15    
 Min.   :   651  
 1st Qu.:  5100  
 Median :  7620  
 Mean   : 12768  
 3rd Qu.: 10083  
 Max.   :871200  
install.packages("lubridate")  
library(lubridate)
dataset <- na.omit(housing_data)
housing_data$date <- ymd(substr(housing_data$date, 1, 8))
head(housing_data)
install.packages("wordcloud")
library(wordcloud)
library(dplyr)

# Generate the Word Cloud for Zipcodes
zipcode_count <- housing_data %>%
  count(zipcode) %>%
  arrange(desc(n))

# Create word cloud
wordcloud(words = zipcode_count$zipcode, 
          freq = zipcode_count$n, 
          min.freq = 1,
           max.words = 50,
          scale = c(2.2, 0.5), 
          colors = brewer.pal(8, "Dark2"))

1.)Word Cloud for Zipcodes

Observations:

i.)Zip codes with larger font sizes are more frequently represented in the dataset, indicating higher occurrence.

ii.)Here Zipcodes 98115 ,98103 ,98034 ,etc have large size which means people tend to buy house in this zipcode ,the reason could be good area,affordable prices.

Questions Answered:

i.)Which zip codes are most prevalent in the dataset?In which area people tend to buy houses more?

ii.)How does the frequency of different zip codes compare visually?

library(ggplot2)
library(scales)  # For formatting y-axis labels

# Define the zip codes to include
zipcodes_to_include <- c(98103, 98004, 98005)

# Filter the data for the specified zip codes and bedrooms up to 10
filtered_data <- housing_data %>% 
  filter(zipcode %in% zipcodes_to_include, bedrooms <= 5)

# Create the boxplot
ggplot(filtered_data, aes(x = factor(bedrooms), y = price, fill = factor(zipcode))) +
  geom_boxplot() +
  labs(title = "Price Distribution by Bedrooms for Selected Zipcodes",
       x = "Number of Bedrooms",
       y = "Price",
       fill = "Zipcode") +
  scale_y_continuous(labels = scales::comma) +  # Format y-axis labels with commas
  theme_minimal()

NA
NA
NA

2.)Boxplot: Price Distribution by Bedrooms for Selected Zipcodes

Observations:

i.)Houses with more bedrooms generally have higher prices.There is a visible increase in the median price as the number of bedrooms increases.

ii.)The variability in prices is greater for houses in zipcode 98004, as indicated by the wider interquartile ranges.This indicates that the posh area tend to have greater variability in prices.

iii.)We can also see zipcode 98004 and 98005 have no houses with 1 bedroom indicating that the area is a deluxe area.

Questions Answered:

i.)How does the price of houses vary with the number of bedrooms in selected zip codes?

ii.)Are there noticeable trends or patterns in price distribution for different bedroom counts?

library(ggplot2)
library(dplyr)  # Ensure dplyr is loaded for data manipulation


filtered_data <- housing_data %>% 
  filter(grade >= 3 & grade <= 10)

# Create the violin plot with the filtered data
ggplot(filtered_data, aes(x = factor(grade), y = price)) +
  geom_violin(fill = "lightblue", drop = FALSE) +
  labs(title = "Price Distribution by Grade (Grades 3 to 10)", 
       x = "Grade", 
       y = "Price") +
  theme_minimal()

3.)Violin Plot: Price Distribution by Grade (Grades 3 to 10)

Observations:

i.)Higher-grade properties generally have higher median prices compared to lower-grade properties.

ii.)The range of prices is broader for higher-grade properties, indicating more variability.

iii.)The density of house prices is higher in the low to mid range of grades which indicates more people(as their are more common people) buy house of low-mid grade.

Questions Answered:

i.)How does the price distribution differ across various property grades?

ii.)What is the spread of house prices for each grade level?

ggplot(housing_data, aes(x = sqft_above, y = price)) +
  geom_point() +
  geom_smooth(method = "lm", color = "purple", se = FALSE) +
  labs(
    title = "Linear Regression of Price vs Square Feet Above",
    x = "Square Feet Above",
    y = "Price"
  ) +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'

4.)Linear Regression Plot: Price vs Square Feet Above

Observations:

i.)There is a positive correlation between price and square footage above ground.

ii.)The regression line shows that as the square footage above ground increases, the price also tends to increase except for some outliers. . iii.)The relationship appears linear, with a steady increase in price with more square footage above ground.

Questions Answered:

i.)What is the relationship between the price of a property and its square footage above ground?

ii.)Does increasing square footage above ground significantly affect property prices?

poly_model <- lm(price ~ poly(sqft_living, 2), data = housing_data)

# Create the plot
ggplot(housing_data, aes(x = sqft_living, y = price)) +
  geom_point(color = "black") +
  stat_smooth(method = "lm", formula = y ~ poly(x, 2), color = "blue", size = 1) +
  labs(title = "Polynomial Regression Plot of Price vs. Square Feet of Living Space",
       x = "Square Feet of Living Space", 
       y = "Price") +
  theme_minimal()

5.)Polynomial Regression Plot: Price vs Square Feet of Living Space

Observations:

i.)The polynomial regression curve shows a non-linear relationship between price and square footage of living space.

ii.)We can see as the square foot of living space increases , the prices increase more non-linearly.

iii.)The relationship is more complex than a simple linear trend, suggesting other factors influence price.

Questions Answered:

i.)How does the price of a property relate to its square footage of living space in a non-linear fashion?

ii.)Is square footage of living space is the only factor affecting price of a house?

install.packages("plotly")
library(plotly)
library(dplyr)

# Filter the data for bedrooms and bathrooms up to 5
filtered_data_3d <- housing_data %>%
  filter(bedrooms <= 5, bathrooms <= 5)

# Create the 3D scatter plot
plot_ly(filtered_data_3d, x = ~bedrooms, y = ~bathrooms, z = ~price, 
        type = "scatter3d", mode = "markers",
        marker = list(size = 5, color = ~price, colorscale = "Viridis")) %>%
  layout(title = "3D Plot: Price vs Bedrooms and Bathrooms (Up to 5)",
         scene = list(xaxis = list(title = 'Bedrooms'),
                      yaxis = list(title = 'Bathrooms'),
                      zaxis = list(title = 'Price')))
NA
NA

6.)3D Scatter Plot: Price vs Bedrooms and Bathrooms

Observations:

i.)Properties with more bedrooms and bathrooms tend to have higher prices.

ii.)The 3D plot shows a clear spread of data points, indicating how price varies with both variables.

iii.)There is a noticeable upward trend in price with increasing numbers of bedrooms and bathrooms except for some outliers.

iv.)We can also see a linear relationship between no. of bedrooms and no.of bathrooms except for some cases.

Questions Answered:

i.)How does the price of a property vary with the number of bedrooms and bathrooms?

ii.)What is the combined effect of bedrooms and bathrooms on property prices?

library(ggplot2)

# Jitter plot for price vs condition
ggplot(housing_data, aes(x = as.factor(condition), y = price, color = as.factor(condition))) +
  geom_jitter(width = 0.2, height = 0, alpha = 0.7) +
  labs(x = "Condition", y = "Price", title = "Jitter Plot: Price vs Condition") +
  theme_minimal() +
  theme(legend.title = element_blank(), legend.position = "bottom")

7.)Jitter Plot: Price vs Condition

Observations:

i.)Prices are spread across different property conditions, showing variability within each condition.

ii.)Higher property conditions(3 to 5) tend to have a broader range of prices.

iii.)The spread of points suggests that price can vary significantly even within the same condition category for example condition 3 and 4.

Questions Answered:

i.)How does property condition impact pricing?

ii.)Are there significant differences in prices among different property conditions?

LS0tDQp0aXRsZTogIkFEViINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpOQU1FIC0gT00gQ0hBTkRSQQ0KDQpVSUQgLSAyMDIxNzAwMDE0DQoNCkJBVENIIC0gTA0KDQpFWFBUIC0gNQ0KDQpgYGB7cn0NCmhvdXNpbmdfZGF0YSA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxPbSBDaGFuZHJhXFxEb3dubG9hZHNcXGFyY2hpdmUgKDIyKVxcSG91c2luZy5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpgYGANCg0KYGBge3J9DQpoZWFkKGhvdXNpbmdfZGF0YSkNCmBgYA0KYGBge3J9DQpzdW1tYXJ5KGhvdXNpbmdfZGF0YSkNCmBgYA0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJsdWJyaWRhdGUiKSAgDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmBgYA0KDQpgYGB7cn0NCmRhdGFzZXQgPC0gbmEub21pdChob3VzaW5nX2RhdGEpDQpgYGANCg0KYGBge3J9DQpob3VzaW5nX2RhdGEkZGF0ZSA8LSB5bWQoc3Vic3RyKGhvdXNpbmdfZGF0YSRkYXRlLCAxLCA4KSkNCmBgYA0KDQpgYGB7cn0NCmhlYWQoaG91c2luZ19kYXRhKQ0KYGBgDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoIndvcmRjbG91ZCIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmxpYnJhcnkoZHBseXIpDQoNCiMgR2VuZXJhdGUgdGhlIFdvcmQgQ2xvdWQgZm9yIFppcGNvZGVzDQp6aXBjb2RlX2NvdW50IDwtIGhvdXNpbmdfZGF0YSAlPiUNCiAgY291bnQoemlwY29kZSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkNCg0KIyBDcmVhdGUgd29yZCBjbG91ZA0Kd29yZGNsb3VkKHdvcmRzID0gemlwY29kZV9jb3VudCR6aXBjb2RlLCANCiAgICAgICAgICBmcmVxID0gemlwY29kZV9jb3VudCRuLCANCiAgICAgICAgICBtaW4uZnJlcSA9IDEsDQogICAgICAgICAgIG1heC53b3JkcyA9IDUwLA0KICAgICAgICAgIHNjYWxlID0gYygyLjIsIDAuNSksIA0KICAgICAgICAgIGNvbG9ycyA9IGJyZXdlci5wYWwoOCwgIkRhcmsyIikpDQoNCmBgYA0KMS4pV29yZCBDbG91ZCBmb3IgWmlwY29kZXMNCg0KT2JzZXJ2YXRpb25zOg0KDQppLilaaXAgY29kZXMgd2l0aCBsYXJnZXIgZm9udCBzaXplcyBhcmUgbW9yZSBmcmVxdWVudGx5IHJlcHJlc2VudGVkIGluIHRoZSBkYXRhc2V0LCBpbmRpY2F0aW5nIGhpZ2hlciBvY2N1cnJlbmNlLg0KDQppaS4pSGVyZSBaaXBjb2RlcyA5ODExNSAsOTgxMDMgLDk4MDM0ICxldGMgaGF2ZSBsYXJnZSBzaXplIHdoaWNoIG1lYW5zIHBlb3BsZSB0ZW5kIHRvIGJ1eSBob3VzZSBpbiB0aGlzIHppcGNvZGUgLHRoZSByZWFzb24gY291bGQgYmUgZ29vZCBhcmVhLGFmZm9yZGFibGUgcHJpY2VzLiANCg0KUXVlc3Rpb25zIEFuc3dlcmVkOg0KDQppLilXaGljaCB6aXAgY29kZXMgYXJlIG1vc3QgcHJldmFsZW50IGluIHRoZSBkYXRhc2V0P0luIHdoaWNoIGFyZWEgcGVvcGxlIHRlbmQgdG8gYnV5IGhvdXNlcyBtb3JlPw0KDQppaS4pSG93IGRvZXMgdGhlIGZyZXF1ZW5jeSBvZiBkaWZmZXJlbnQgemlwIGNvZGVzIGNvbXBhcmUgdmlzdWFsbHk/DQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzY2FsZXMpICAjIEZvciBmb3JtYXR0aW5nIHktYXhpcyBsYWJlbHMNCg0KIyBEZWZpbmUgdGhlIHppcCBjb2RlcyB0byBpbmNsdWRlDQp6aXBjb2Rlc190b19pbmNsdWRlIDwtIGMoOTgxMDMsIDk4MDA0LCA5ODAwNSkNCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgemlwIGNvZGVzIGFuZCBiZWRyb29tcyB1cCB0byAxMA0KZmlsdGVyZWRfZGF0YSA8LSBob3VzaW5nX2RhdGEgJT4lIA0KICBmaWx0ZXIoemlwY29kZSAlaW4lIHppcGNvZGVzX3RvX2luY2x1ZGUsIGJlZHJvb21zIDw9IDUpDQoNCiMgQ3JlYXRlIHRoZSBib3hwbG90DQpnZ3Bsb3QoZmlsdGVyZWRfZGF0YSwgYWVzKHggPSBmYWN0b3IoYmVkcm9vbXMpLCB5ID0gcHJpY2UsIGZpbGwgPSBmYWN0b3IoemlwY29kZSkpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJQcmljZSBEaXN0cmlidXRpb24gYnkgQmVkcm9vbXMgZm9yIFNlbGVjdGVkIFppcGNvZGVzIiwNCiAgICAgICB4ID0gIk51bWJlciBvZiBCZWRyb29tcyIsDQogICAgICAgeSA9ICJQcmljZSIsDQogICAgICAgZmlsbCA9ICJaaXBjb2RlIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKyAgIyBGb3JtYXQgeS1heGlzIGxhYmVscyB3aXRoIGNvbW1hcw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoyLilCb3hwbG90OiBQcmljZSBEaXN0cmlidXRpb24gYnkgQmVkcm9vbXMgZm9yIFNlbGVjdGVkIFppcGNvZGVzDQoNCk9ic2VydmF0aW9uczoNCg0KaS4pSG91c2VzIHdpdGggbW9yZSBiZWRyb29tcyBnZW5lcmFsbHkgaGF2ZSBoaWdoZXIgcHJpY2VzLlRoZXJlIGlzIGEgdmlzaWJsZSBpbmNyZWFzZSBpbiB0aGUgbWVkaWFuIHByaWNlIGFzIHRoZSBudW1iZXIgb2YgYmVkcm9vbXMgaW5jcmVhc2VzLg0KDQppaS4pVGhlIHZhcmlhYmlsaXR5IGluIHByaWNlcyBpcyBncmVhdGVyIGZvciBob3VzZXMgaW4gemlwY29kZSA5ODAwNCwgYXMgaW5kaWNhdGVkIGJ5IHRoZSB3aWRlciBpbnRlcnF1YXJ0aWxlIHJhbmdlcy5UaGlzIGluZGljYXRlcyB0aGF0IHRoZSBwb3NoIGFyZWEgdGVuZCB0byBoYXZlIGdyZWF0ZXIgdmFyaWFiaWxpdHkgaW4gcHJpY2VzLg0KDQppaWkuKVdlIGNhbiBhbHNvIHNlZSB6aXBjb2RlIDk4MDA0IGFuZCA5ODAwNSBoYXZlIG5vIGhvdXNlcyB3aXRoIDEgYmVkcm9vbSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFyZWEgaXMgYSBkZWx1eGUgYXJlYS4NCg0KUXVlc3Rpb25zIEFuc3dlcmVkOg0KDQppLilIb3cgZG9lcyB0aGUgcHJpY2Ugb2YgaG91c2VzIHZhcnkgd2l0aCB0aGUgbnVtYmVyIG9mIGJlZHJvb21zIGluIHNlbGVjdGVkIHppcCBjb2Rlcz8NCg0KaWkuKUFyZSB0aGVyZSBub3RpY2VhYmxlIHRyZW5kcyBvciBwYXR0ZXJucyBpbiBwcmljZSBkaXN0cmlidXRpb24gZm9yIGRpZmZlcmVudCBiZWRyb29tIGNvdW50cz8NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKSAgIyBFbnN1cmUgZHBseXIgaXMgbG9hZGVkIGZvciBkYXRhIG1hbmlwdWxhdGlvbg0KDQojIEZpbHRlciBkYXRhIHRvIGluY2x1ZGUgb25seSBncmFkZXMgZnJvbSAzIHRvIDEwDQpmaWx0ZXJlZF9kYXRhIDwtIGhvdXNpbmdfZGF0YSAlPiUgDQogIGZpbHRlcihncmFkZSA+PSAzICYgZ3JhZGUgPD0gMTApDQoNCiMgQ3JlYXRlIHRoZSB2aW9saW4gcGxvdCB3aXRoIHRoZSBmaWx0ZXJlZCBkYXRhDQpnZ3Bsb3QoZmlsdGVyZWRfZGF0YSwgYWVzKHggPSBmYWN0b3IoZ3JhZGUpLCB5ID0gcHJpY2UpKSArDQogIGdlb21fdmlvbGluKGZpbGwgPSAibGlnaHRibHVlIiwgZHJvcCA9IEZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiUHJpY2UgRGlzdHJpYnV0aW9uIGJ5IEdyYWRlIChHcmFkZXMgMyB0byAxMCkiLCANCiAgICAgICB4ID0gIkdyYWRlIiwgDQogICAgICAgeSA9ICJQcmljZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQozLilWaW9saW4gUGxvdDogUHJpY2UgRGlzdHJpYnV0aW9uIGJ5IEdyYWRlIChHcmFkZXMgMyB0byAxMCkNCg0KT2JzZXJ2YXRpb25zOg0KDQppLilIaWdoZXItZ3JhZGUgcHJvcGVydGllcyBnZW5lcmFsbHkgaGF2ZSBoaWdoZXIgbWVkaWFuIHByaWNlcyBjb21wYXJlZCB0byBsb3dlci1ncmFkZSBwcm9wZXJ0aWVzLg0KDQppaS4pVGhlIHJhbmdlIG9mIHByaWNlcyBpcyBicm9hZGVyIGZvciBoaWdoZXItZ3JhZGUgcHJvcGVydGllcywgaW5kaWNhdGluZyBtb3JlIHZhcmlhYmlsaXR5Lg0KDQppaWkuKVRoZSBkZW5zaXR5IG9mIGhvdXNlIHByaWNlcyBpcyBoaWdoZXIgaW4gdGhlIGxvdyB0byBtaWQgcmFuZ2Ugb2YgZ3JhZGVzIHdoaWNoIGluZGljYXRlcyBtb3JlIHBlb3BsZShhcyB0aGVpciBhcmUgbW9yZSBjb21tb24gcGVvcGxlKSBidXkgaG91c2Ugb2YgbG93LW1pZCBncmFkZS4NCg0KUXVlc3Rpb25zIEFuc3dlcmVkOg0KDQppLilIb3cgZG9lcyB0aGUgcHJpY2UgZGlzdHJpYnV0aW9uIGRpZmZlciBhY3Jvc3MgdmFyaW91cyBwcm9wZXJ0eSBncmFkZXM/DQoNCmlpLilXaGF0IGlzIHRoZSBzcHJlYWQgb2YgaG91c2UgcHJpY2VzIGZvciBlYWNoIGdyYWRlIGxldmVsPw0KDQpgYGB7cn0NCmdncGxvdChob3VzaW5nX2RhdGEsIGFlcyh4ID0gc3FmdF9hYm92ZSwgeSA9IHByaWNlKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJwdXJwbGUiLCBzZSA9IEZBTFNFKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGluZWFyIFJlZ3Jlc3Npb24gb2YgUHJpY2UgdnMgU3F1YXJlIEZlZXQgQWJvdmUiLA0KICAgIHggPSAiU3F1YXJlIEZlZXQgQWJvdmUiLA0KICAgIHkgPSAiUHJpY2UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCjQuKUxpbmVhciBSZWdyZXNzaW9uIFBsb3Q6IFByaWNlIHZzIFNxdWFyZSBGZWV0IEFib3ZlDQoNCk9ic2VydmF0aW9uczoNCg0KaS4pVGhlcmUgaXMgYSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHByaWNlIGFuZCBzcXVhcmUgZm9vdGFnZSBhYm92ZSBncm91bmQuDQoNCmlpLilUaGUgcmVncmVzc2lvbiBsaW5lIHNob3dzIHRoYXQgYXMgdGhlIHNxdWFyZSBmb290YWdlIGFib3ZlIGdyb3VuZCBpbmNyZWFzZXMsIHRoZSBwcmljZSBhbHNvIHRlbmRzIHRvIGluY3JlYXNlIGV4Y2VwdCBmb3Igc29tZSBvdXRsaWVycy4NCi4NCmlpaS4pVGhlIHJlbGF0aW9uc2hpcCBhcHBlYXJzIGxpbmVhciwgd2l0aCBhIHN0ZWFkeSBpbmNyZWFzZSBpbiBwcmljZSB3aXRoIG1vcmUgc3F1YXJlIGZvb3RhZ2UgYWJvdmUgZ3JvdW5kLg0KDQpRdWVzdGlvbnMgQW5zd2VyZWQ6DQoNCmkuKVdoYXQgaXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcmljZSBvZiBhIHByb3BlcnR5IGFuZCBpdHMgc3F1YXJlIGZvb3RhZ2UgYWJvdmUgZ3JvdW5kPw0KDQppaS4pRG9lcyBpbmNyZWFzaW5nIHNxdWFyZSBmb290YWdlIGFib3ZlIGdyb3VuZCBzaWduaWZpY2FudGx5IGFmZmVjdCBwcm9wZXJ0eSBwcmljZXM/DQoNCmBgYHtyfQ0KcG9seV9tb2RlbCA8LSBsbShwcmljZSB+IHBvbHkoc3FmdF9saXZpbmcsIDIpLCBkYXRhID0gaG91c2luZ19kYXRhKQ0KDQojIENyZWF0ZSB0aGUgcGxvdA0KZ2dwbG90KGhvdXNpbmdfZGF0YSwgYWVzKHggPSBzcWZ0X2xpdmluZywgeSA9IHByaWNlKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsYWNrIikgKw0KICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHBvbHkoeCwgMiksIGNvbG9yID0gImJsdWUiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIlBvbHlub21pYWwgUmVncmVzc2lvbiBQbG90IG9mIFByaWNlIHZzLiBTcXVhcmUgRmVldCBvZiBMaXZpbmcgU3BhY2UiLA0KICAgICAgIHggPSAiU3F1YXJlIEZlZXQgb2YgTGl2aW5nIFNwYWNlIiwgDQogICAgICAgeSA9ICJQcmljZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KNS4pUG9seW5vbWlhbCBSZWdyZXNzaW9uIFBsb3Q6IFByaWNlIHZzIFNxdWFyZSBGZWV0IG9mIExpdmluZyBTcGFjZQ0KDQpPYnNlcnZhdGlvbnM6DQoNCmkuKVRoZSBwb2x5bm9taWFsIHJlZ3Jlc3Npb24gY3VydmUgc2hvd3MgYSBub24tbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHByaWNlIGFuZCBzcXVhcmUgZm9vdGFnZSBvZiBsaXZpbmcgc3BhY2UuDQoNCmlpLilXZSBjYW4gc2VlIGFzIHRoZSBzcXVhcmUgZm9vdCBvZiBsaXZpbmcgc3BhY2UgaW5jcmVhc2VzICwgdGhlIHByaWNlcyBpbmNyZWFzZSBtb3JlIG5vbi1saW5lYXJseS4gDQoNCmlpaS4pVGhlIHJlbGF0aW9uc2hpcCBpcyBtb3JlIGNvbXBsZXggdGhhbiBhIHNpbXBsZSBsaW5lYXIgdHJlbmQsIHN1Z2dlc3Rpbmcgb3RoZXIgZmFjdG9ycyBpbmZsdWVuY2UgcHJpY2UuDQoNClF1ZXN0aW9ucyBBbnN3ZXJlZDoNCg0KaS4pSG93IGRvZXMgdGhlIHByaWNlIG9mIGEgcHJvcGVydHkgcmVsYXRlIHRvIGl0cyBzcXVhcmUgZm9vdGFnZSBvZiBsaXZpbmcgc3BhY2UgaW4gYSBub24tbGluZWFyIGZhc2hpb24/DQoNCmlpLilJcyBzcXVhcmUgZm9vdGFnZSBvZiBsaXZpbmcgc3BhY2UgaXMgdGhlIG9ubHkgZmFjdG9yIGFmZmVjdGluZyBwcmljZSBvZiBhIGhvdXNlPw0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciBiZWRyb29tcyBhbmQgYmF0aHJvb21zIHVwIHRvIDUNCmZpbHRlcmVkX2RhdGFfM2QgPC0gaG91c2luZ19kYXRhICU+JQ0KICBmaWx0ZXIoYmVkcm9vbXMgPD0gNSwgYmF0aHJvb21zIDw9IDUpDQoNCiMgQ3JlYXRlIHRoZSAzRCBzY2F0dGVyIHBsb3QNCnBsb3RfbHkoZmlsdGVyZWRfZGF0YV8zZCwgeCA9IH5iZWRyb29tcywgeSA9IH5iYXRocm9vbXMsIHogPSB+cHJpY2UsIA0KICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIG1vZGUgPSAibWFya2VycyIsDQogICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDUsIGNvbG9yID0gfnByaWNlLCBjb2xvcnNjYWxlID0gIlZpcmlkaXMiKSkgJT4lDQogIGxheW91dCh0aXRsZSA9ICIzRCBQbG90OiBQcmljZSB2cyBCZWRyb29tcyBhbmQgQmF0aHJvb21zIChVcCB0byA1KSIsDQogICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ0JlZHJvb21zJyksDQogICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0JhdGhyb29tcycpLA0KICAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICdQcmljZScpKSkNCg0KDQpgYGANCjYuKTNEIFNjYXR0ZXIgUGxvdDogUHJpY2UgdnMgQmVkcm9vbXMgYW5kIEJhdGhyb29tcw0KDQpPYnNlcnZhdGlvbnM6DQoNCmkuKVByb3BlcnRpZXMgd2l0aCBtb3JlIGJlZHJvb21zIGFuZCBiYXRocm9vbXMgdGVuZCB0byBoYXZlIGhpZ2hlciBwcmljZXMuDQoNCmlpLilUaGUgM0QgcGxvdCBzaG93cyBhIGNsZWFyIHNwcmVhZCBvZiBkYXRhIHBvaW50cywgaW5kaWNhdGluZyBob3cgcHJpY2UgdmFyaWVzIHdpdGggYm90aCB2YXJpYWJsZXMuDQoNCmlpaS4pVGhlcmUgaXMgYSBub3RpY2VhYmxlIHVwd2FyZCB0cmVuZCBpbiBwcmljZSB3aXRoIGluY3JlYXNpbmcgbnVtYmVycyBvZiBiZWRyb29tcyBhbmQgYmF0aHJvb21zIGV4Y2VwdCBmb3Igc29tZSBvdXRsaWVycy4NCg0KaXYuKVdlIGNhbiBhbHNvIHNlZSBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBuby4gb2YgYmVkcm9vbXMgYW5kIG5vLm9mIGJhdGhyb29tcyBleGNlcHQgZm9yIHNvbWUgY2FzZXMuIA0KDQpRdWVzdGlvbnMgQW5zd2VyZWQ6DQoNCmkuKUhvdyBkb2VzIHRoZSBwcmljZSBvZiBhIHByb3BlcnR5IHZhcnkgd2l0aCB0aGUgbnVtYmVyIG9mIGJlZHJvb21zIGFuZCBiYXRocm9vbXM/DQoNCmlpLilXaGF0IGlzIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYmVkcm9vbXMgYW5kIGJhdGhyb29tcyBvbiBwcm9wZXJ0eSBwcmljZXM/DQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIEppdHRlciBwbG90IGZvciBwcmljZSB2cyBjb25kaXRpb24NCmdncGxvdChob3VzaW5nX2RhdGEsIGFlcyh4ID0gYXMuZmFjdG9yKGNvbmRpdGlvbiksIHkgPSBwcmljZSwgY29sb3IgPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIsIGhlaWdodCA9IDAsIGFscGhhID0gMC43KSArDQogIGxhYnMoeCA9ICJDb25kaXRpb24iLCB5ID0gIlByaWNlIiwgdGl0bGUgPSAiSml0dGVyIFBsb3Q6IFByaWNlIHZzIENvbmRpdGlvbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KYGBgDQo3LilKaXR0ZXIgUGxvdDogUHJpY2UgdnMgQ29uZGl0aW9uDQoNCk9ic2VydmF0aW9uczoNCg0KaS4pUHJpY2VzIGFyZSBzcHJlYWQgYWNyb3NzIGRpZmZlcmVudCBwcm9wZXJ0eSBjb25kaXRpb25zLCBzaG93aW5nIHZhcmlhYmlsaXR5IHdpdGhpbiBlYWNoIGNvbmRpdGlvbi4NCg0KaWkuKUhpZ2hlciBwcm9wZXJ0eSBjb25kaXRpb25zKDMgdG8gNSkgdGVuZCB0byBoYXZlIGEgYnJvYWRlciByYW5nZSBvZiBwcmljZXMuDQoNCmlpaS4pVGhlIHNwcmVhZCBvZiBwb2ludHMgc3VnZ2VzdHMgdGhhdCBwcmljZSBjYW4gdmFyeSBzaWduaWZpY2FudGx5IGV2ZW4gd2l0aGluIHRoZSBzYW1lIGNvbmRpdGlvbiBjYXRlZ29yeSBmb3IgZXhhbXBsZSBjb25kaXRpb24gMyBhbmQgNC4NCg0KUXVlc3Rpb25zIEFuc3dlcmVkOg0KDQppLilIb3cgZG9lcyBwcm9wZXJ0eSBjb25kaXRpb24gaW1wYWN0IHByaWNpbmc/DQoNCmlpLilBcmUgdGhlcmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gcHJpY2VzIGFtb25nIGRpZmZlcmVudCBwcm9wZXJ0eSBjb25kaXRpb25zPw0K